package com.mes.schedule.mt;

import java.io.Serializable;
import java.util.Comparator;

import com.mes.schedule.domain.SOperationTask;


/**
 * 任务调度顺序的优先级比较
 * 
 * @author Administrator
 * 
 */
public class TaskScheduleComparator implements Comparator<SOperationTask>,Serializable {

	@Override
	public int compare(SOperationTask operTask1, SOperationTask operTask2) {
		if (operTask1.equals(operTask2))
			return 0;
		int i = -1;
		// 都是锁定的情况下
		// 优先级越大表示越不重要
		// 同等优先级松弛率越大表示越不重要
		// if (!operTask1.isStarted()) {//开始状态的考虑已经融入计算优先级
		try {
			if (operTask1.getCalPriority() > operTask2.getCalPriority())
				i = 1;
			else if (operTask1.getCalPriority().compareTo(
					operTask2.getCalPriority()) == 0) {

				if (operTask1.getDelayCost() < operTask2.getDelayCost())
					i = 1;
				else if (operTask1.getDelayCost().compareTo(
						operTask2.getDelayCost()) == 0) {
						if (operTask1.getSlackFactor() > operTask2.getSlackFactor())
							i = 1;
						else if (operTask1.getSlackFactor().compareTo(// 同工时条件下松弛率优先
								operTask2.getSlackFactor()) == 0) {
							i = operTask1.getBatchNum().compareTo(
									operTask2.getBatchNum());
							if (i == 0) {
								i=-1;// 千万不能出现那种=0的现象，否则会出现认为两工序相等而不调度的现象
								if (operTask1.getTaskDistance() > operTask2
										.getTaskDistance())
									i = 1;
								else if (operTask1.getTaskDistance() == operTask2
										.getTaskDistance()) {
									if (operTask1.getOperationId() > operTask2
											.getOperationId())
										i = 1;
									// lqm todo
									// 2013-12-21
									// by lqm todo
									// 千万不能出现那种=0的现象，否则会出现认为两工序相等而不调度的现象
									// i=operTask1.getTaskUid().compareTo(operTask2..getTaskUid()
								}
							}

						}
					
				}
			}
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		// }
		return i;
	}

}
